#include "reserva.h"
#include "lista.h"

Reserva::Reserva() {

	_documento = 0;
	_fechaDesde = 0;
	_fechaHasta = 0;
	_tipo = Simple;
	_confirmada = false;
}

Reserva::Reserva(const DNI documento, const Fecha fechaDesde, const Fecha fechaHasta, const TipoHabitacion tipo) {

	_documento = documento;
	_fechaDesde = fechaDesde;
	_fechaHasta = fechaHasta;
	_tipo = tipo;
	_confirmada = false;
}

DNI Reserva::documento() const {

	return _documento;
}

Fecha Reserva::fechaDesde() const {

	return _fechaDesde;
}

Fecha Reserva::fechaHasta() const {

	return _fechaHasta;
}

TipoHabitacion Reserva::tipo() const {

	return _tipo;
}

bool Reserva::confirmada() const {

	return _confirmada;
}

void Reserva::confirmar() {

	_confirmada = true;
}

bool Reserva::operator==(const Reserva& r) const {

	return _documento == r._documento
			&& _fechaDesde == r._fechaDesde
			&& _fechaHasta == r._fechaHasta
			&& _tipo == r._tipo
			&& _confirmada == r._confirmada;
}

std::ostream & operator<<(std::ostream & os,const Reserva & r)
{
    os << "Documento:" << r.documento() << "FechaDesde:" << r.fechaDesde() << "FechaHasta:" << r.fechaHasta() << "Tipo" << r.tipo() << "Confirmada:" << r.confirmada();
    return os;
}

void Reserva::mostrar(std::ostream& os) const {

	os << ENCABEZADO_ARCHIVO;
	os << _documento << " ";
	os << _fechaDesde << " ";
	os << _fechaHasta << " ";
	os << "|" << _tipo << "|";
	os << "|" << _confirmada << "|";
}

void Reserva::guardar(std::ostream& os) const {

	mostrar(os);
}

void Reserva::cargar (std::istream& is) {

	char x;
	is >> x; // encabezado
	is >> _documento;
	is >> _fechaDesde;
	is >> _fechaHasta;
	is >> x; // |
	string tipo;
	getline(is, tipo, '|');
	_tipo = tipoDeHabitacion(tipo);

	is >> x; // |
	string confirmada;
	getline(is, confirmada, '|');
	_confirmada = confirmada == "True";
}

TipoHabitacion Reserva::tipoDeHabitacion(string tipo) const {

	if (tipo == "Simple") return Simple;
	else if (tipo == "Doble") return Doble;
	else if (tipo == "Triple") return Triple;
	else return Cuadruple;
}
